package ar.edu.utn.frba.gdaia.src.action;

	import java.util.*;

	import ar.edu.utn.frba.gdaia.src.domain.*;
	import ar.edu.utn.frba.gdaia.src.main.*;

	public class GeneralizarSituacionesCommand1 {
		Regla ReglaCand;
		Regla ReglaEv;
		Situacion SICand;
		Situacion SFCand;
		Concepto ConcCand;
			
		public void execute (Map parameters){
			Set ListaCorta = ObtenerListaCorta (parameters, Command.LISTA_CORTA);
			if(ListaCorta == null){
				return;
			}
			HashMap<Situacion, ArrayList> ReglasSFIguales = ObtenerReglasSFIguales(ListaCorta);
			for(Iterator iterRegla = ReglasSFIguales.keySet().iterator();iterRegla.hasNext();){
				Situacion key = (Situacion)iterRegla.next();
				ArrayList ReglasSFIgual = ReglasSFIguales.get(key);
				LinkedHashMap conceptosSI = ObtenerConceptosSI(ReglasSFIgual);
				ObtenerReglasGeneralizadas(conceptosSI);
			}
			}
		public LinkedHashMap ObtenerConceptosSI(List reglasSFIgual){
			LinkedHashMap ConceptosSI = new LinkedHashMap();
			for (Iterator iter = reglasSFIgual.iterator(); iter.hasNext();){
				Regla reglaSFIgual = (Regla) iter.next();
				Situacion SituacionInicial = reglaSFIgual.getSituacionInicial();
				for(Iterator iter1 = SituacionInicial.getEstado().iterator();iter1.hasNext();){
					ConceptoElemental conceptoElemental = (ConceptoElemental)iter1.next();
					Integer cantidadConceptosSI = (Integer)ConceptosSI.get(conceptoElemental);
					if(cantidadConceptosSI == null){
						cantidadConceptosSI = new Integer (1);
					}else{
						cantidadConceptosSI++;
					}
					ConceptosSI.put(conceptoElemental, cantidadConceptosSI);
			}
					}
			return ConceptosSI;
			}
			
		
		public void ObtenerReglasGeneralizadas (LinkedHashMap conceptosSI){
			//Regla reglaCandidata = new Regla (cere);
			ArrayList estadoCandidato = new ArrayList();
			Situacion situacionCandidata = new Situacion (estadoCandidato, Canal.INT_GENERALIZAR_SITUACIONES);
			for(Iterator iter = conceptosSI.keySet().iterator(); iter.hasNext();){
				ConceptoElemental conceptoElemental = (ConceptoElemental)iter.next();
				if((Integer) conceptosSI.get (conceptoElemental)>= Cerebro.cantidadRepeticionesMemoriaCronologica){
					estadoCandidato.add(conceptoElemental);
				}
			}
			System.out.println(situacionCandidata);
		}
		
		private HashMap<Situacion, ArrayList>ObtenerReglasSFIguales(Set listaCorta){
			HashMap<Situacion, ArrayList> ReglasSFIguales = new HashMap<Situacion, ArrayList>();
			ArrayList ReglasSFIgual = null;
			for(Iterator iterRegla = listaCorta.iterator(); iterRegla.hasNext(); ){
				Regla ReglaListaCorta = (Regla) iterRegla.next();
				Situacion SitFinal = ReglaListaCorta.getSituacionFinal();
				ReglasSFIgual = ReglasSFIguales.get(SitFinal);
				if(ReglasSFIgual == null){
					ReglasSFIgual = new ArrayList();
				}
				ReglasSFIgual.add(ReglaListaCorta);
				ReglasSFIguales.put(SitFinal, ReglasSFIgual);
			}
			return ReglasSFIguales;
		}
		public Set ObtenerListaCorta (Map map, String commad){
			Set ListaCorta = (Set)map.get(Command.LISTA_CORTA);
			return ListaCorta;
		}
		}